package com.example.redislearning.service;

import java.util.Map;

/**
 * 限流服务接口
 * 基于Redis实现令牌桶和时间窗口限流
 */
public interface RateLimitService {

    /**
     * 检查API调用是否被限流
     * @param apiKey API标识
     * @param userId 用户ID
     * @param maxRequests 最大请求数
     * @param timeWindow 时间窗口（秒）
     */
    boolean isApiRateLimited(String apiKey, Integer userId, int maxRequests, int timeWindow);

    /**
     * 检查用户行为是否被限流
     * @param action 行为类型：login, register, comment, like
     * @param userId 用户ID
     * @param maxActions 最大行为次数
     * @param timeWindow 时间窗口（秒）
     */
    boolean isUserActionRateLimited(String action, Integer userId, int maxActions, int timeWindow);

    /**
     * 获取API剩余调用次数
     * @param apiKey API标识
     * @param userId 用户ID
     * @param maxRequests 最大请求数
     * @param timeWindow 时间窗口（秒）
     */
    int getApiRemainingRequests(String apiKey, Integer userId, int maxRequests, int timeWindow);

    /**
     * 获取用户行为剩余次数
     * @param action 行为类型
     * @param userId 用户ID
     * @param maxActions 最大行为次数
     * @param timeWindow 时间窗口（秒）
     */
    int getUserActionRemaining(String action, Integer userId, int maxActions, int timeWindow);

    /**
     * 重置API限流计数
     * @param apiKey API标识
     * @param userId 用户ID
     */
    boolean resetApiRateLimit(String apiKey, Integer userId);

    /**
     * 重置用户行为限流计数
     * @param action 行为类型
     * @param userId 用户ID
     */
    boolean resetUserActionRateLimit(String action, Integer userId);

    /**
     * 获取限流统计信息
     * @param apiKey API标识
     * @param userId 用户ID
     */
    String getRateLimitInfo(String apiKey, Integer userId);

    /**
     * 配置限流规则
     * @param apiKey API标识
     * @param maxRequests 最大请求数
     * @param timeWindow 时间窗口（秒）
     * @param burstSize 突发流量大小
     */
    boolean configureRateLimit(String apiKey, int maxRequests, int timeWindow, int burstSize);

    /**
     * 检查IP是否被限流
     * @param ipAddress IP地址
     * @param maxRequests 最大请求数
     * @param timeWindow 时间窗口（秒）
     */
    boolean isIpRateLimited(String ipAddress, int maxRequests, int timeWindow);

    /**
     * 全局API限流检查
     * @param apiKey API标识
     * @param maxRequests 最大请求数
     * @param timeWindow 时间窗口（秒）
     */
    boolean isGlobalApiRateLimited(String apiKey, int maxRequests, int timeWindow);

    /**
     * 获取当前限流状态
     * @param apiKey API标识
     * @param userId 用户ID
     */
    Map<String, Object> getCurrentRateLimitStatus(String apiKey, Integer userId);

    /**
     * 动态调整限流阈值
     * @param apiKey API标识
     * @param newMaxRequests 新的最大请求数
     * @param newTimeWindow 新的时间窗口（秒）
     */
    boolean adjustRateLimitThreshold(String apiKey, int newMaxRequests, int newTimeWindow);

    /**
     * 清理过期的限流数据
     */
    void cleanupExpiredRateLimitData();
}